home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
simcode.arc
/
XRECV.C
< prev
next >
Wrap
Text File
|
1984-11-29
|
6KB
|
276 lines
char soh = 0x01;
char eot = 0x04;
char ack = 0x06;
char nak = 0x15;
char can = 0x18;
#include "stdio.h"
#include "signal.h"
#include "termio.h"
#include "sys/ioctl.h"
struct termio save;
struct termio new;
int lfproc = 0;
int debug = 0;
int remote = 0;
FILE *errors;
main(argc, argv)
int argc;
char **argv;
{
int i,j;
char buf[130];
char remote_name[70];
char blocknum = 1;
char c_blocknum = 254;
int numread;
char cksum;
char inch;
int alarmfn();
int kleenex();
FILE *fp;
extern char *optarg;
extern int optind;
char file[128];
ioctl(1, TCGETA, &save);
ioctl(1, TCGETA, &new);
while ((i = getopt(argc, argv, "lrtd")) != EOF)
switch(i) {
case 'd':
debug++;
break;
case 'l':
case 't': /* TEXT file */
lfproc++;
break;
case 'r': /* remote file */
remote++;
break;
case '?':
fprintf(stderr, "Usage: %s [-d] file\n", argv[0]);
kleenex(0);
break;
}
if (debug) errors = fopen("xr.err", "w");
if (debug && errors == NULL) {
fprintf(stderr, "Unable to open xr.err for error tracing\n");
kleenex(1);
}
if (debug) setbuf(errors, NULL);
if (argc == 1 || argc == optind) {
fprintf(stderr, "Need file name\n");
kleenex(0);
}
strcpy(file, argv[optind]);
for (i=1; i<20;i++) signal(i, SIG_IGN);
signal(14, alarmfn);
signal(3, kleenex);
signal(1,kleenex);
if ((fp=fopen(file, "w")) == NULL) {
fprintf(stderr, "File not writeable: %s\n", file);
kleenex(0);
}
printf("File '%s' ready for to be received.......\n", file);
printf("Type ^X to exit, xtrans ignores signals\n");
fflush(stdin);
new.c_iflag = IGNBRK|IGNPAR;
new.c_oflag = 0;
new.c_lflag = 0;
new.c_cc[4] = 1;
new.c_cflag &= ~PARENB;
new.c_cflag |= CS8;
ioctl(1, TCSETAW, &new);
if (remote==1){
int i;
sprintf(remote_name,"\033ux%s\032",argv[optind+1]);
for (i=0;remote_name[i];i++)
if (remote_name[i]=='/') remote_name[i] = '\\';
write(1,remote_name,strlen(remote_name));
}
else sleep(10);
write(1, &nak, 1);
while (1) {
TOP:
i = get_x_char(10, &inch);
if (i == -1) {
if (debug) fprintf(errors, "Timeout on block %d during SOH\n",blocknum);
purge_send(nak);
continue;
}
if (inch == can) {
if (debug) fprintf(errors, "CAN received at block %d\n", blocknum);
kleenex(0);
}
if (inch == eot) {
if (debug) fprintf(errors, "EOT received at block %d\n", blocknum);
break;
}
if (inch != soh) {
if (debug) fprintf(errors, "Bad SOH on block %d\n",blocknum);
purge_send(nak);
continue;
}
i = get_x_char(10, &inch);
if (i == -1 ) {
if (debug) fprintf(errors, "Timeout on block %d during blocknum\n",blocknum);
purge_send(nak);
continue;
}
if (inch != blocknum) {
if (debug) fprintf(errors, "Bad blocknum on block %d, expected %d, got %d\n",blocknum,blocknum,i);
purge_send(nak);
continue;
}
i = get_x_char(10, &inch);
if (i == -1 ) {
if (debug) fprintf(errors, "Timeout on block %d during c_blocknum\n",blocknum);
purge_send(nak);
continue;
}
if (inch != c_blocknum) {
if (debug) fprintf(errors, "Bad c_blocknum on block %d, expected %d, got %d\n",blocknum,c_blocknum,
i);
purge_send(nak);
continue;
}
for (i=0;i<128;i++) {
j = get_x_char(10, &inch);
if (j == -1) {
if (debug) fprintf(errors, "Timeout during block %d, during data recv, on char %d\n", blocknum,
i);
purge_send(nak);
goto TOP; /* AUGGH, a GOTO. horrendous */
}
buf[i] = inch;
}
cksum = 0;
for (i=0;i<128;i++) {
cksum = cksum + buf[i];
/*if (debug) fprintf(errors,"Added %d to checksum, now %d\n",j,cksum);*/
}
cksum = cksum % 256;
i = get_x_char(10, &inch);
if (i == -1 ) {
if (debug) fprintf(errors, "Timeout on block %d during checksum\n",blocknum);
purge_send(nak);
continue;
}
if (cksum != inch) {
if (debug) fprintf(errors, "Bad checksum on block %d, expected %d, got %d\n",blocknum,cksum,i);
purge_send(nak);
continue;
}
if (debug) fprintf(errors, "Validated block %d\n",blocknum);
write(1, &ack, 1);
{int iput;
static int eot_flag = 0;
iput=128; /* assume full buffer */
if (lfproc){
iput=0;
for (i=0;i<128;i++){
if (buf[i] == 26){ /* MS-DOS eot */
eot_flag = 1; /* 1st stage */
break;
}
if (buf[i] != 13) buf[iput++] = buf[i];
}
}
if (eot_flag < 2){
fwrite(buf,iput,1,fp);
if (eot_flag == 1) eot_flag=2; /* 2nd stage */
}
}
blocknum = (blocknum+1) % 256;
c_blocknum = 255 - blocknum;
}
write(1, &ack, 1);
sleep(1);
kleenex(0);
}
kleenex(x)
int x;
{
ioctl(1, TCSETA, &save);
if (debug) fprintf(errors, "Caught signal %d\n", x);
exit(x);
}
alarmfn() {
signal(14, alarmfn);
}
read_in(fp, buf, num)
FILE *fp;
char *buf;
int num;
{
int i;
int c;
static int cr_held = 0;
i = 0;
if (cr_held) {
buf[i] = '\r';
i++;
cr_held = 0;
}
for( ;i < num;i++) {
c = getc(fp);
if (c == EOF) {
return(i);
}
if (c == '\n' && lfproc) {
buf[i] = c;
if (i == 127) {
cr_held = 1;
return(128);
}
buf[i+1] = '\r';
i++;
}
else {
buf[i] = c;
}
}
return(i);
}
clear_inq() {
int j;
char ch;
signal(14, alarmfn);
do {
j = get_x_char(2, &ch);
/*if (debug) fprintf(errors, "cleared line of %d\n", j);*/
} while (j > -1);
}
get_x_char(timeout, cp)
int timeout;
char *cp;
{
int ch;
extern int errno;
int ret;
alarm(timeout);
if ((ch=getchar()) == EOF) {
/*if (debug) fprintf(errors, "get_x_char returning read error\n");*/
/*if (debug) fprintf(errors, "Errno == %d\n", errno);*/
return(-1);
}
alarm(0);
*cp = ch;
return( ch );
}
purge_send(ch)
char ch;
{
int j;
char cp;
/*if (debug) fprintf(errors, "Begin purge_send(%d)\n", ch);*/
do {
j = get_x_char(2, &cp);
} while (j != -1);
write(1, &ch, 1);
/*if (debug) fprintf(errors, "End purge_send(%d)\n", ch);*/
}